package com.hsqyz.esp32_led.factory.frame;

import com.hsqyz.esp32_led.common.utils.SpringUtils;
import com.hsqyz.esp32_led.config.iot.IotConfig;
import com.hsqyz.esp32_led.model.dto.Esp32MessageDto;
import io.netty.handler.codec.DecoderException;
import lombok.extern.slf4j.Slf4j;

/**
 * 抽象帧解码器
 *
 * @param <T> 解码器类型
 */
@Slf4j
public abstract class Esp32AbstractFrameDecoder<T> {

    public T tryDecode(Esp32MessageDto messageDto) throws DecoderException {
        //  解析数据
        T decode = null;
        try {
            decode = decode(messageDto);
            // 打印日志
            IotConfig iotConfig = SpringUtils.getBean(IotConfig.class);
            if (iotConfig.isEnableLogging()) {
                log.info("Frame{},解析结果:{}", messageDto.getCmd(), decode);
            }
        } catch (DecoderException e) {
            log.error("Frame解码异常: {}", e.getMessage());
        }
        // 调用具体实现方法
        return decode;
    }

    /**
     * 解码
     *
     * <p>
     * 解码过程是抽象的，由具体的子类实现，以适应不同类型的业务消息解码需求。
     * 本函数定义了解码操作的一般接口，强制子类提供具体实现。
     *
     * @param messageDto 待解码的Netty消息Dto对象，包含编码后的业务数据。
     * @return 解码后的业务对象，类型为泛型T。
     * @throws DecoderException 如果解码过程中发生错误，将抛出DecoderException异常。
     */
    public abstract T decode(Esp32MessageDto messageDto) throws DecoderException;

}